package org.shoukaiseki.test.corssorigin.demo3;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorssConfig3 {



    Logger logger= LoggerFactory.getLogger("com.hkedou.corsconfig");

    @Value("${hkedou.corss.allowedorigins}")
    String[] allowedorigins;

    @Bean
    public CorssInterceptor3 getTokenInterceptor(){
        return new CorssInterceptor3();
    }

    @Bean
    public WebMvcConfigurer crossConfigurer()
    {
        return new WebMvcConfigurer(){
//            public void addCorsMappings(CorsRegistry registry) {
//                //https://stackoverflow.com/questions/47057592/spring-cors-and-angular-not-working-http-status-code-403-error?rq=1 中的解决方案没试过
//                //重定向的 跨域 需要在 TokenInterceptor 拦截器中设置,或者 CorsFilter 过滤器中设置 response 的header
//                //response.setHeader("Access-Control-Allow-Origin", origin);
//                //response.setHeader("allowedOrigins", origin);
//                logger.info("-------CorssConfig.addCorsMappings.allowedorigins="+ JSON.toJSONString(allowedorigins));
//                registry.addMapping("/**")
//                        //允许的域列表，“*”表示支持所有的域
//                        .allowedOrigins(allowedorigins)
//                        .allowedHeaders(CrossOrigin.DEFAULT_ALLOWED_HEADERS)
//
//                        //暴露的头信息
//                        .exposedHeaders(HttpHeaders.SET_COOKIE)
////                        .allowedHeaders("Content-Type, x-requested-with, X-Custom-Header, Hkedou-Access-Token")
//                        /**
//                         * 设置是否发送凭证，该值是在预请求的响应的“Access-Control-Max-Age”上设置的。该值决定在发起跨域请求时，浏览器是否需要发送凭证。
//                         * false　　—　　cookies不应该包括在内；
//                         * ""　　　 —　　意味着未定义，允许所有值；
//                         * true　　 —　　预响应将包括值设置为true的报头Access-Control-Allow-Credentials
//                         */
//                        //允许Cookie跨域，在做登录校验的时候有用
//                        .allowCredentials(true)
//                        //支持的HTTP请求方法集合
//                        .allowedMethods(HttpMethod.DELETE.name(), HttpMethod.GET.name(), HttpMethod.HEAD.name(), HttpMethod.POST.name(), HttpMethod.PUT.name())
//                        //预响应缓存的最大持续时间，单位秒
//                        //预检请求的缓存时间（秒），即在这个时间段里，对于相同的跨域请求不会再预检了
//                        .maxAge(CrossOrigin.DEFAULT_MAX_AGE);
//
//            }

            public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
                logger.info("---------CorssConfig.configureContentNegotiation");
                configurer.favorPathExtension(true)
                        .ignoreAcceptHeader(true).
                        defaultContentType(MediaType.APPLICATION_JSON_UTF8);
                configurer.favorPathExtension(false);
                configurer.mediaType("json",MediaType.APPLICATION_JSON_UTF8);
            }

            public void addInterceptors(InterceptorRegistry registry){
                registry.addInterceptor(getTokenInterceptor()).addPathPatterns("/**");
            }
        };
    }



}
